const gulp =require('gulp')
const htmlmin=require('gulp-htmlmin')
const autoprefixer=require('gulp-autoprefixer')
const babel = require('gulp-babel')
const cleanCss=require('gulp-clean-css')
const uglify = require('gulp-uglify')
const connect = require('gulp-connect')
const del=require('del')
const sass = require('gulp-sass')
const proxy = require('http-proxy-middleware')

// 把所有任务涉及到的路径做一个统一规划
const path={
    html:{
            src:'src/**/*.html',
            dest:'dist'
    },
    css:{
        src:'src/css/**/*.scss',
        dest:'dist/css'
    },
    js:{
        src: 'src/js/**/*.js',
        dest: 'dist/js'
    },
    img: {
        src: 'src/images/**/*',
        dest: 'dist/images'
    },
    libs: {
        src: 'src/libs/**/*',
        dest: 'dist/libs'
    }
}

const delDist = () => del('dist')
//指定html任务，压缩html文件

const html=()=>{
    //** 所有目录
    //* 所有文件
    return gulp.src(path.html.src).pipe(htmlmin({
        removeComments: true,//清除HTML注释
        collapseWhitespace: true,//压缩HTML
        collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input checked />
        removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
        removeScriptTypeAttributes: false,//删除<script>的type="text/javascript"
        removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
        minifyJS: true,//压缩页面JS
        minifyCSS: true//压缩页面CSS 
    }))
    .pipe(gulp.dest(path.html.dest))  //dest 目的地
    .pipe(connect.reload())
}

//指定css任务

const css = () => {
    return gulp.src(path.css.src)
        .pipe(sass()) // 先把sass编译成css
        .pipe(autoprefixer())
        .pipe(cleanCss())
        .pipe(gulp.dest(path.css.dest))
        .pipe(connect.reload())
}

//指定JS任务
const js = () => {
    return gulp.src(path.js.src)
        .pipe(babel({
            presets: ['@babel/env']
        }))
        .pipe(uglify())
        .pipe(gulp.dest(path.js.dest))
        .pipe(connect.reload())
}

//img 任务：
const img = () => gulp.src(path.img.src).pipe(gulp.dest(path.img.dest))
// libs任务：把libs目录里的所有文件移动到dist
const libs = () => gulp.src(path.libs.src).pipe(gulp.dest(path.libs.dest))

const server = () => {
    connect.server({
        root: 'dist', // 项目运行根目录 dist
        port: 2333, // 服务器自定义端口号
        livereload: true, // 支持热更新
        middleware: function () {
            return [
                // 把将来url以/api开头的请求都实现代理到apache服务器
                proxy.createProxyMiddleware('/api', {
                    target: 'http://localhost',
                    changeOrigin: true
                })
            ]
        }
    })
}

// const ico=()=>gulp.src('src/favicon.ico').pipe(gulp.dest('dist'))


//watch:监听文件改变，当文件内容发生改变时候可以重启任务
const watch = () => {
    // 当html文件发生修改的时候重新执行html任务
    gulp.watch(path.html.src, html)
    gulp.watch(path.css.src, css)
    gulp.watch(path.js.src, js)
}
//导出任务
// 默认任务：default 我们可以把所有任务都放进default
// series 同步执行，先执行删除dist任务，再执行其他任务
// parallel 异步执行（并行），不会互相影响的任务可以并行
module.exports.default = gulp.series(delDist, gulp.parallel(html, js, css, img, libs, watch, server))